package work;
import java.util.Scanner;
import java.util.InputMismatchException;

public class CmdTest {
    public static void main(String[] args) {
        try {
            // 检查命令行参数的个数是否至少为3个
            if (args.length < 3) {
                throw new ArrayIndexOutOfBoundsException("捕获ArrayIndexOutOfBoundsException异常：从命令行传来的参数个数不足");
            }
    
            // 将命令行参数转换为整数和运算符
            int x = parseInteger(args[0]);  
            int y = parseInteger(args[1]);  
            char op = args[2].charAt(0);    // 第三个参数是运算符，取第一个字符
            
            // 执行计算并输出结果
            int result = performCalculation(x, y, op);
            System.out.println("result = " + result);
    
        } catch (ArrayIndexOutOfBoundsException e) {
            // 捕获数组下标越界异常并输出错误信息
            System.out.println("错误: " + e.getMessage());
            System.out.println("用法: java CmdTest <数字1> <数字2> <运算符>");
        } catch (NumberFormatException e) {
            // 捕获数字格式异常，输入的值无法转为整数
            System.out.println("捕获NumberFormatException异常： " + e.getMessage());
        } catch (ArithmeticException e) {
            // 捕获算术异常，如除数为0
            System.out.println("错误: " + e.getMessage());
            remedyProcess();  // 调用 remedyProcess 方法处理错误
        } catch (Exception e) {
            // 捕获其他任何异常
            System.out.println("发生了一个意外的错误: " + e.getMessage());
        } finally {
            
            System.out.println("不管是否有异常，总是要执行\n");
        }
    }
    
    // 将字符串转换为整数，若输入无法转为整数，则抛出 NumberFormatException
    private static int parseInteger(String str) throws NumberFormatException {
        try {
            return Integer.parseInt(str);  // 尝试将字符串转换为整数
        } catch (NumberFormatException e) {
            // 如果转换失败，抛出自定义的异常信息
            throw new NumberFormatException("输入的值 " + str + " 不是有效的数字！");
        }
    }

    // 执行基本的四则运算，并根据运算符决定运算方式
    private static int performCalculation(int x, int y, char op) throws ArithmeticException {
        switch (op) {
            case '+': 
                return x + y;
            case '-':  
                return x - y;
            case '*':  
                return x * y;
            case '/': 
                if (y == 0) {
                    // 如果除数为0，抛出算术异常
                    throw new ArithmeticException("除数不能为0");
                }
                return x / y;
            default:
                // 如果运算符无效，抛出非法参数异常
                throw new IllegalArgumentException("无效的运算符: " + op);
        }
    }

    // 处理除以零错误的补救措施
    public static void remedyProcess() {
        Scanner scanner = new Scanner(System.in);  // 创建 Scanner 对象读取用户输入
        boolean validInput = false;  // 用于标记输入是否有效

        while (!validInput) {  // 当输入无效时重复循环
            System.out.println("除以零是不允许的，请重新输入");
            try {
                // 提示用户输入新的数字和运算符
                System.out.print("第一个数字: ");
                int x = scanner.nextInt();
                System.out.print("第二个数字: ");
                int y = scanner.nextInt();
                System.out.print("运算符: ");
                char op = scanner.next().charAt(0);  // 获取运算符

                // 执行运算并输出结果
                int result = performCalculation(x, y, op);
                System.out.println("result = " + result);
                validInput = true;  // 如果输入有效，则退出循环

            } catch (InputMismatchException e) {
                // 如果用户输入的不是数字，捕获该异常并提示重新输入
                System.out.println("错误：请输入有效的数字！");
                scanner.nextLine();  // 清空输入缓冲区，防止死循环
            } catch (ArithmeticException e) {
                // 捕获除以零或其他算术错误
                System.out.println("错误: " + e.getMessage());
            } catch (IllegalArgumentException e) {
                // 捕获无效运算符错误
                System.out.println("错误: " + e.getMessage());
            }
        }
        scanner.close();  // 关闭 Scanner 资源
    }
}
